#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

#define _GNU_SOURCE

//不定参数的使用
//##表示，当不定参数为空时，取消前面的逗号
#define LOG(fmt, ...) printf("[%s:%d]->" fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__); 

// int main()
// {
//     LOG("%s:%d","hello world", 123);
//     LOG("%s:%d","张三", 18);
//     LOG("%s:%d","李四", 20);

// 	return 0;
// }

//不定参数访问
//打印传入的参数
// void printNum(int count, ...)
// {
//     va_list ag;
//     va_start(ag, count); //获取不定参数的首地址
//     for(int i = 0; i < count; i++)
//     {
//         int num = va_arg(ag, int);
//         printf("%d ", num);
//     }
//     printf("\n");
//     va_end(ag);
// }

// int main()
// {
//     printNum(5, 1, 2, 3, 4, 5);
//     printNum(3, 100, 200, 300);
//     printNum(2, 1, 2);

//     return 0;
// }

//模拟实现printf
void myprintf(const char* fmt, ...)
{
    va_list ag;
    va_start(ag, fmt);
    char* res = NULL;
    int ret = vasprintf(&res, fmt, ag); //解析不定参数内容形成字符串，并且让res指针指向解析的内容
    if(ret != -1) //-1表示解析失败
    {
        printf(res);//输出内容
        free(res);//释放解析的空间
    }
    va_end(ag);
}

int main()
{
    myprintf("%s：%d\n","张三", 18);
    myprintf("%s：%d\n","李四", 20);
    myprintf("hello world\n");

    return 0;
}
